package org.csu.mall.util;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import okhttp3.OkHttpClient;


import java.io.*;
import java.net.URL;
import java.net.URLConnection;

public class QiniuUtil {

    //指定上传区域
    private static Configuration cfg = new Configuration(Region.region2());
    //设置好账号的ACCESS_KEY和SECRET_KEY
    private static String ACCESS_KEY = "olq7zsf-zBul2wmYUf87Na1aINOFqRF078zxIcge"; //这两个登录七牛 账号里面可以找到
    private static String SECRET_KEY = "KIBzJchgBh5MDizGpmnETBa5otjDZAlVg3Rc-04z";

    //要上传的空间
    private static String bucketname = "csumall"; //对应要上传到七牛上 你的那个路径（自己建文件夹 注意设置私有）

    //密钥配置
    private static Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    //创建上传对象
    private static UploadManager uploadManager = new UploadManager(cfg);


    /**
     * 简单上传，使用默认策略，只需要设置上传的空间名就可以了
     *
     * @param fileName 文件上传至七牛云空间的名称
     * @return
     */
    public static String getUpToken(String fileName) {
        //return auth.uploadToken(bucketname);
        //<bucket>:<key>，表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”，已存在同名资源则会被本次覆盖。
        //如果希望只能上传指定key的文件，并且不允许修改，那么可以将下面的 insertOnly 属性值设为 1。
        //第三个参数是token的过期时间
        StringMap putPolicy = new StringMap();
        putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize)}");
        return auth.uploadToken(bucketname, fileName, 3600, putPolicy);
    }

    /**
     * 普通上传
     *
     * @param filePath 文件路径
     * @param fileName 文件上传至七牛云空间的名称
     * @throws IOException
     */
    public static void upload(String filePath, String fileName) {
        try {
            //调用put方法上传
            Response res = uploadManager.put(filePath, fileName, getUpToken(fileName));
            //打印返回的信息
            System.out.println(res.bodyString());
        } catch (QiniuException e) {
            Response r = e.response;
            // 请求失败时打印的异常的信息
            System.out.println(r.toString());
            try {
                //响应的文本信息
                System.out.println(r.bodyString());
            } catch (QiniuException e1) {
                //ignore
                e.printStackTrace();
            }
        }
    }


    /**
     * 获取下载文件路径，即：donwloadUrl
     *
     * @return
     */
    public static String getDownloadUrl(String filename) {
        String baseUrl = PropertiesUtil.getProperty("image.server.url");
        String targetUrl = String.format("%s/%s", baseUrl, filename);
//        String downloadUrl = auth.privateDownloadUrl(targetUrl);
        return targetUrl;
    }

    /**
     * 文件下载
     *
     * @param filePath
     */
    public static void download(String filePath, String filename) {
        //获取downloadUrl
        String downloadUrl = getDownloadUrl(filename);
        //本地保存路径
//        String filePath = "E:\\chen\\";
        writeLocal(downloadUrl, filePath, filename);
    }

    /**
     * 通过发送http get 请求获取文件资源
     *
     * @param urlString
     * @param filepath
     * @return
     */
    private static void writeLocal(String urlString, String filepath, String filename) {

        try {
            // 构造URL
            URL url = new URL(urlString);
            // 打开连接
            URLConnection con = url.openConnection();
            //设置请求超时为5s
            con.setConnectTimeout(5*1000);
            InputStream is = con.getInputStream();
            byte[] data = readInputStream(is);
            //判断文件夹是否存在，不存在则创建
            File file = new File(filepath);
            if (!file.exists() && !file.isDirectory()) {
                System.out.println("===文件夹不存在===创建====");
                file.mkdir();
            }
            File imgFile = new File(filepath + filename);
            FileOutputStream fops = new FileOutputStream(imgFile);
            fops.write(data);
            fops.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取字节输入流内容
     *
     * @param is
     * @return
     */
    private static byte[] readInputStream(InputStream is) {
        ByteArrayOutputStream writer = new ByteArrayOutputStream();
        byte[] buff = new byte[1024 * 2];
        int len = 0;
        try {
            while ((len = is.read(buff)) != -1) {
                writer.write(buff, 0, len);
            }
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return writer.toByteArray();
    }

//    public static void main(String args[]) throws IOException{
////        String filename = "qq3.jpg";
//        String filepath = "D:\\研究生材料\\研究生材料\\本科生信息\\个人图片\\qq3.jpg";
//        String[] str = filepath.split("\\\\");
//        String filename = str[str.length - 1];
//        QiniuUtil.upload(filepath, filename);
////        QiniuUtil.download(filepath, filename);
//    }
}
